<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>

        /* test();
        function test(){
            console.log('hello world');
        };
        test();

        var test = 200;
        test(); */

        /* 预解析  */

        // 第一行 不需要  
        // 第二行 需要  声明一个变量 test 然后赋值一个函数
        // 第三行不需要   
        // 第四行 需要 声明一个test变量 但是不赋值 里边还是函数
        // 第五行 不需要  


        /* 执行  */

        // 1.因为预解析的时候声明了一个变量 test 然后赋值了一个函数
        // 所以这个能正常调用 

        // 3.test() 也能正常调用  
        // 4. test = 200 对test变量进行了赋值  
        // test 原来是函数  现在赋值了200 那么把函数覆盖了  
        // 5.又把 test 函数来调用 但是此时test 是个变量 
        // test is not a function 


        // 当函数名 和变量名重复的时候 
        // 预解析阶段 以 函数名为准  
        // 上面  声明test变量 并赋值一个函数
        //  后来  声明一个变量 但是不赋值
        // 这个时候 函数名和变量名冲突 
        // 以函数为准  

        test();

        var test = 200;  // 预解析 声明变量 不赋值
        test();
        function test(){ // 声明变量test 并且赋值函数
            console.log('6666')
        }

        test();


        // 预解析完成test里边就是函数  


        /* 执行  */

        // test() 因为里边是函数  能正常调用  
        // test 被放进来200  
        // test() 当做函数调用会被报错  
        // test() 报错   test is not a function  

    </script>
</body>
</html>